package Class_Object.接口.内部类;

import Class_Object.People;
//TODO 匿名内部类
interface IA {
    void test();
}


//TODO 静态内部类:不需要外部类的引用
class Out{

    public int data1 = 1;
    public static int data2 = 2;
    private int data3 = 3;
    static class InnerClass {
        public int data4 = 4;
        public static int data5 = 5;
        private int data6 = 6;
        public void test() {
            Out out = new Out();
            System.out.println(out.data1);//可以通过这种方式访问外部的非静态的变量或者方法
            System.out.println("InnerClass::test()");//自己的this
//            System.out.println(data1);外部非静态都不能访问
            System.out.println(data2);
//            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

        }
    }
    public void test() {
        System.out.println("out::test()");
    }

}
//TODO 实例内部类
class OterClass {
    public int data1 = 1;
    public static int data2 = 2;
    private int data3 = 3;
    class InnerClass {
        OterClass oterClass = new OterClass();//在内部类里面也可以创建外部类的实例
        public int data1 = 111;//优先访问自己的
        public int data4 = 4;
//        public static int data5 = 5;
        public  static final int data5 = 5;//编译的时候就确定
        private int data6 = 6;
        public void test(){
            System.out.println("InnerClass::test()" + this.data1);//自己的this
            System.out.println("InnerClass::test()" + OterClass.this.data1);//访问外部的同名变量,外部类的this
            System.out.println("InnerClass::test()" + data2);
            System.out.println("InnerClass::test()" + data3);
            System.out.println("InnerClass::test()" + data4);
            System.out.println("InnerClass::test()" + data5);
            System.out.println("InnerClass::test()" + data6);
        }

    }
    public void test() {
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data1);//直接创建内部类的实例来访问内部类的成员
        System.out.println("OuterClass::test()");

    }
}
public class Test {
    //TODO 局部内部类:定义在方法里面的类
    public void fuc() {
        class AA{
            public int a = 1;

        }
        AA aa = new AA();
        int a = aa.a;
    }

    public static void main(String[] args) {
      new IA() {//TODO 匿名内部类,相当于有一个类实现了IA接口,重写了test()方法
            @Override
            public void test() {
                System.out.println("这是重写的接口的方法1!");
            }
        }.test();
      //俩种调用test()的方式
      IA ia = new IA() {//TODO 匿名内部类,相当于有一个类实现了IA接口,重写了test()方法
          @Override
          public void test() {
              System.out.println("这是重写的接口的方法2!");
          }
      };
     ia.test();
    }

    public static void main2(String[] args) {
        //TODO 静态内部类
        Out.InnerClass innerClass = new Out.InnerClass();
        innerClass.test();
    }
    //事物的内部还有一个完整的实体,把一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类
    //实例内部类,静态内部类,局部内部类(很少),匿名内部类
    public static void main1(String[] args) {
        //如何实例化实例内部类的对象呢?通过外部类.内部类,通过外部类的引用来调用内部类
        OterClass oterClass = new OterClass();
        OterClass.InnerClass innerClass = oterClass.new InnerClass();
        innerClass.test();

    }
}


